import { forEachValue } from "../utils";
import Module from "./module";

export class ModuleCollection {
  // 用户配置项
  constructor(rootModule) {
    this.root = null; // 根
    this.register(rootModule, []);
  }

  // 查找 key 模块信息
  get(path) {
    return path.reduce((module, key) => {
      return module.getChild(key);
    }, this.root);
  }

  // 获取命名空间
  getNamespace(path) {
    let module = this.root;
    return path.reduce((namespace, key) => {
      module = module.getChild(key); // 子模块
      return namespace + (module.namespaced ? key + "/" : "");
    }, "");
  }

  // 注册模块形成树形结构
  register(rawModule, path) {
    const newModule = new Module(rawModule);
    if (path.length === 0) {
      this.root = newModule; // 根模块
    } else {
      const parent = this.get(path.slice(0, -1)); // 获取父级模块
      parent.addChild(path[path.length - 1], newModule);
    }
    // 判断用户是否写了模块信息
    if (rawModule.modules) {
      forEachValue(rawModule.modules, (rawChildModule, key) => {
        this.register(rawChildModule, path.concat(key)); // 递归进行
      });
    }
  }
}
